/**
 * 
 */
package server.alarmThreads;


import java.io.IOException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;
import java.util.Scanner;

import org.apache.log4j.Logger;

import server.config.ServerConfig;
import server.container.SMSAlamierung;
import server.db.SQL;


/**
 * @author Christian
 * 
 */
public class SMSVersandThread implements Runnable {
	
	private static Logger logger = Logger.getLogger(SMSVersandThread.class);
	
	private List<SMSAlamierung> list;
	
	private boolean threadOk = true;
	
	public SMSVersandThread(List<SMSAlamierung> smsAlarmList) {

		this.list = smsAlarmList;
	}
	
	/**
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {

		logger.trace("run Methode");
		while (threadOk) {
			synchronized (list) {
				if (list.isEmpty()) {
					try {
						list.wait();
					} catch (InterruptedException e) {
					}
				}
			}
			if (!list.isEmpty()) {
				SMSAlamierung smsAlarmierung = null;
				boolean smsAuftragErhalten = false;
				// Noch nicht bearbeitet alarmierung aus der liste holen
				synchronized (list) {
					for (int i = 0; i < list.size(); i++) {
						smsAlarmierung = list.get(i);
						// Einträge mit vielen Fehlern löschen
						if (smsAlarmierung.getErrors().size() >= 5) {
							logger.warn("5 Alamierungs errors " + smsAlarmierung.getErrorString());
							list.remove(smsAlarmierung);
							i--;
						}
						if (smsAlarmierung.isKorrektGesendet()) {
							list.remove(smsAlarmierung);
							i--;
							continue;
						}
						if (smsAlarmierung.isUsed()) {
							continue;
						}
						long lastError = smsAlarmierung.getLastError();
						int errorCount = smsAlarmierung.getErrors().size();
						long naechsterAlamierungsVersuch = (10000 * errorCount * errorCount * errorCount)
								+ System.currentTimeMillis();
						if (smsAlarmierung.isUsed()
								|| (naechsterAlamierungsVersuch < System.currentTimeMillis() && lastError != 0)) {
							sleep(10);
							continue;
						} else {
							smsAlarmierung.setUsed(true);
							smsAuftragErhalten = true;
							break;
						}
					}
				}
				if (smsAuftragErhalten) {
					sendSMS(smsAlarmierung);
				}
			} else {
				sleep(10);
			}
		}
	}
	
	private void sendSMS(SMSAlamierung smsAlarmierung) {

		String nummer = smsAlarmierung.getNummer();
		nummer = nummer.replaceAll(" ", "");
		logger.trace("Alarmieren von " + nummer);
		String url = "";
		StringBuilder logBuilder = new StringBuilder();
		Scanner scanner = null;
		try {
			//Strings Escapen
			String message = URLEncoder.encode(smsAlarmierung.getAlarm().toString() + " " +
							" Kontostand: " + smsAlarmierung.getKontostand(), "UTF-8");
			String absender =  URLEncoder.encode(smsAlarmierung.getAbsender(), "UTF-8");
			url = "https://gateway.smstrade.de/?key="+ServerConfig.getInstance().getSMSKey()+"&to=" + nummer + "&"
					+ "message=" + message + "&route=" + smsAlarmierung.getSMSMode()
					+ "&from=" + absender + "&dlr=1&messsage_id=1&ref=" + smsAlarmierung.getUserId() + "&cost=1&debug=";
			if (ServerConfig.getInstance().isDebug()) {
				url += "1";
			} else {
				url += "0";
			}
			logBuilder.append("\n");
			logBuilder.append("--------SMS-Alarm--------\n");
			logBuilder.append("Nummer: ");
			logBuilder.append(nummer);
			logBuilder.append("\n");
			logBuilder.append("\n");
			logBuilder.append(url);
			logBuilder.append("\n");
			URL con = new URL(url);
			scanner = new Scanner(con.openStream());
			boolean sendenOK = false;
			while (scanner.hasNext()) {
				String part = scanner.nextLine();
				if (part.startsWith("0")) {
					try {
						Double.parseDouble(part);
						SQL.getInstance().addKosten(nummer, part);
					} catch (NumberFormatException e) {
						logger.error("Kostenfehler: " + part);
					}
				}
				if (part.equals("10")) {
					SQL.setNumberInValid(smsAlarmierung);
					smsAlarmierung.addError("10");
				}
				if (part.equals("20")) {
					smsAlarmierung.addError("20");
				}
				if (part.equals("30")) {
					smsAlarmierung.addError("30");
				}
				if (part.equals("31")) {
					smsAlarmierung.addError("31");
				}
				if (part.equals("40")) {
					smsAlarmierung.addError("40");
				}
				if (part.equals("50")) {
					smsAlarmierung.addError("50");
				}
				if (part.equals("60")) {
					smsAlarmierung.addError("60");
				}
				if (part.equals("70")) {
					smsAlarmierung.addError("70");
				}
				if (part.equals("71")) {
					smsAlarmierung.addError("71");
				}
				if (part.equals("80")) {
					smsAlarmierung.addError("80");
				}
				if (part.equals("100")) {
					sendenOK = true;
				}
				if (!part.equals("")) {
					logger.debug(part);
					logBuilder.append(part);
					logBuilder.append("\n");
				}
			}
			logBuilder.append("----ENDE-SMS----");
			logger.info(logBuilder.toString());
			smsAlarmierung.setKorrektGesendet(sendenOK);
		} catch (IOException e) {
			smsAlarmierung.addError(e.getMessage());
			
			logger.error("SMS-Fehler" + url, e);
		} finally {
			if(scanner != null) {
				scanner.close();
			}
			smsAlarmierung.setUsed(false);
		}
	}
	
	/**
	 * 
	 * @param sleep
	 *            Sleep
	 */
	private void sleep(long sleep) {

		try {
			Thread.sleep(sleep);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
